package logic

import (
	"context"
	"errors"
	"gozero-microservices/common-service/rpc/types/common"
	"gozero-microservices/gateway-api/internal/svc"
	"gozero-microservices/gateway-api/internal/types"

	"github.com/zeromicro/go-zero/core/logx"
)

/*
 +----------------------------------------------------------------------
 + Title        : BannerLogic
 + Author       : huwl
 + Version      : 1.0.0
 + Initial-Time : 2025-08-08
 + Last-time    : 这个文件最后修改的时间 + 修改人的名称
 + Desc         : 横幅逻辑
 +----------------------------------------------------------------------
*/

type BannerLogic struct {
	BaseLogic
}

/**
 * 创建横幅逻辑实例
 *
 * @param context.Context ctx ----------------------必传
 * @param *svc.ServiceContext svcCtx ---------------必传
 * @return *BannerLogic
 * @author huwl
 * @date 2025/10/22 12:54:03
 */
func NewBannerLogicInstance(ctx context.Context, svcCtx *svc.ServiceContext) *BannerLogic {
	return &BannerLogic{
		BaseLogic{
			Ctx:    ctx,
			SvcCtx: svcCtx,
			Logger: logx.WithContext(ctx),
		},
	}
}

/**
 * 新增
 *
 * @param string Title ------------------------必传,标题
 * @param string ImageUrl ---------------------非必传,图片
 * @param uint8 Type --------------------------非必传,类型
 * @param string Link -------------------------非必传,链接
 * @param uint8 Sort --------------------------非必传,排序
 * @param string Note -------------------------非必传,备注
 * @return error
 * @author huwl
 * @date 2025/10/20 18:51:38
 */
func (logic *BannerLogic) Add(params types.BannerAddRequest) error {
	if params.Title == "" {
		return errors.New("请输入标题")
	}

	// 远程调用公共服务中的横幅服务
	_, err := logic.SvcCtx.BannerSrv.AddBanner(logic.Ctx, &common.AddBannerRequest{
		Title:    params.Title,
		ImageUrl: params.ImageUrl,
		Type:     uint32(params.Type),
		Link:     params.Link,
		Sort:     uint32(params.Sort),
		Note:     params.Note,
		Status:   1,
	})

	return err
}

/**
 * 删除
 *
 * @param string Ids --------------------------必传,Id支持多个
 * @return error
 * @author huwl
 * @date 2025/10/20 18:51:38
 */
func (logic *BannerLogic) Delete(params types.BannerDeleteRequest) error {
	if params.Ids == "" {
		return errors.New("Id错误")
	}

	// 远程调用公共服务中的横幅服务
	_, err := logic.SvcCtx.BannerSrv.DeleteBanner(logic.Ctx, &common.DeleteRequest{
		Ids: params.Ids,
	})

	return err
}

/**
 * 编辑
 *
 * @param uint16 Id ---------------------------必传,Id
 * @param string Title ------------------------非必传,标题
 * @param string ImageUrl ---------------------非必传,图片
 * @param uint8 Type --------------------------非必传,类型
 * @param string Link -------------------------非必传,链接
 * @param string Note -------------------------非必传,备注
 * @param uint8 Sort --------------------------非必传,排序
 * @return error
 * @author huwl
 * @date 2025/10/22 10:15:55
 */
func (logic *BannerLogic) Edit(params types.BannerEditRequest) error {
	if params.Id <= 0 {
		return errors.New("Id错误")
	}

	// 远程调用公共服务中的横幅服务
	_, err := logic.SvcCtx.BannerSrv.EditBanner(logic.Ctx, &common.EditBannerRequest{
		Id:       uint32(params.Id),
		Title:    params.Title,
		ImageUrl: params.ImageUrl,
		Type:     uint32(params.Type),
		Link:     params.Link,
		Note:     params.Note,
		Sort:     uint32(params.Sort),
	})

	return err
}

/**
 * 编辑状态
 *
 * @param string Ids --------------------------必传,Id支持多个
 * @param int8 Status -------------------------必传,状态
 * @return *common.Result, error
 * @author huwl
 * @date 2025/10/22 10:15:55
 */
func (logic *BannerLogic) EditStatus(params types.BannerEditStatusRequest) (*common.Result, error) {
	if params.Ids == "" {
		return nil, errors.New("Id错误")
	}

	// 远程调用公共服务中的横幅服务
	return logic.SvcCtx.BannerSrv.EditStatusBanner(logic.Ctx, &common.EditStatusRequest{
		Ids:    params.Ids,
		Status: int32(params.Status),
	})
}

/**
 * 详情
 *
 * @param uint16 Id ---------------------------必传,Id
 * @return *common.Banner, error
 * @author huwl
 * @date 2025/10/22 10:15:55
 */
func (logic *BannerLogic) Detail(id uint16) (*common.Banner, error) {
	if id <= 0 {
		return nil, errors.New("Id错误")
	}

	// 远程调用公共服务中的横幅服务
	return logic.SvcCtx.BannerSrv.BannerDetail(logic.Ctx, &common.DetailRequest{Id: uint64(id)})
}

/**
 * 列表
 *
 * @param uint16 Id ---------------------------非必传,Id
 * @param string Ids --------------------------非必传,Id支持多个
 * @param string Title ------------------------非必传,标题
 * @param string Type -------------------------非必传,类型
 * @param string Status -----------------------非必传,状态
 * @param string StartCreateTime --------------非必传,开始创建时间
 * @param string EndCreateTime ----------------非必传,结束创建时间
 * @param string SortField --------------------非必传,排序字段
 * @param string SortType ---------------------非必传,排序方式
 * @param uint8 PageSize ----------------------非必传,条数
 * @param int8 Page ---------------------------非必传,页码
 * @return *common.BannerListResult, error
 * @author huwl
 * @date 2025/10/22 10:15:55
 */
func (logic *BannerLogic) List(params types.BannerQueryRequest) (*common.BannerListResult, error) {
	status := params.Status
	if status == "" {
		status = "all"
	}

	// 远程调用公共服务中的横幅服务
	return logic.SvcCtx.BannerSrv.BannerList(logic.Ctx, &common.QueryBannerRequest{
		Id:              uint32(params.Id),
		Ids:             params.Ids,
		Title:           params.Title,
		Type:            params.Type,
		Status:          status,
		StartCreateTime: params.StartCreateTime,
		EndCreateTime:   params.EndCreateTime,
		SortField:       params.SortField,
		SortType:        params.SortType,
		Page:            uint32(params.Page),
		PageSize:        int32(params.PageSize),
	})
}

/**
 * 数量
 *
 * @param uint16 Id ---------------------------非必传,Id
 * @param string Ids --------------------------非必传,Id支持多个
 * @param string Title ------------------------非必传,标题
 * @param string Type -------------------------非必传,类型
 * @param string Status -----------------------非必传,状态
 * @param string StartCreateTime --------------非必传,开始创建时间
 * @param string EndCreateTime ----------------非必传,结束创建时间
 * @return *common.TotalResult, error
 * @author huwl
 * @date 2025/10/22 10:15:55
 */
func (logic *BannerLogic) Total(params types.BannerQueryRequest) (*common.TotalResult, error) {
	status := params.Status
	if status == "" {
		status = "all"
	}

	// 远程调用公共服务中的横幅服务
	return logic.SvcCtx.BannerSrv.BannerTotal(logic.Ctx, &common.QueryBannerRequest{
		Id:              uint32(params.Id),
		Ids:             params.Ids,
		Title:           params.Title,
		Type:            params.Type,
		Status:          status,
		StartCreateTime: params.StartCreateTime,
		EndCreateTime:   params.EndCreateTime,
	})
}
